package com.example.entity;

import lombok.Data;
import lombok.Builder;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import javax.validation.constraints.*;
import java.math.BigDecimal;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.Optional;

/**
 * 停车记录实体类
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ParkingRecord {

    /**
     * 主键ID
     */
    private Long id;

    /**
     * 车牌号（格式校验：中文/字母开头+数字）
     */
    @NotBlank
    @Pattern(regexp = "^[\\u4e00-\\u9fa5A-Za-z][A-Za-z0-9]{5,7}$")
    private String plateNumber;

    /**
     * 入场时间（必须早于出场时间）
     */
    @NotNull
    private LocalDateTime entryTime;

    /**
     * 出场时间（可为空表示未出场）
     */
    private LocalDateTime exitTime;

    /**
     * 停车时长（分钟，自动计算）
     */
    @Min(0)
    private Long parkingDuration;

    /**
     * 关联的收费配置ID
     */
    @NotNull
    private Long feeConfigId;

    /**
     * 计算费用（自动计算）
     */
    @DecimalMin("0.00")
    private BigDecimal calculatedFee;

    /**
     * 实际收费（默认等于计算费用，可人工调整）
     */
    @DecimalMin("0.00")
    private BigDecimal actualFee;

    /**
     * 支付状态枚举
     * 0-未支付 1-已支付 2-已退款
     */
    @Min(0) @Max(2)
    private Integer paymentStatus;

    /**
     * 支付时间
     */
    private LocalDateTime paymentTime;

    /**
     * 支付方式（wechat/alipay/cash/card）
     */
    private String paymentMethod;

    /**
     * 停车场ID
     */
    @NotNull
    private Long parkingLotId;

    /**
     * 入场通道编号
     */
    private String entryGate;

    /**
     * 出场通道编号
     */
    private String exitGate;

    /**
     * 车辆类型（small/medium/large/special）
     */
    private String vehicleType;

    /**
     * 创建时间（自动记录）
     */
    private LocalDateTime createTime;

    /**
     * 更新时间（自动记录）
     */
    private LocalDateTime updateTime;

    /**
     * 操作人ID
     */
    private Long operatorId;

    /**
     * 备注信息
     */
    @Size(max = 200)
    private String remark;

    // 计算停车时长（分钟）
    public void calculateDuration() {
        this.parkingDuration = Optional.ofNullable(exitTime)
                .map(et -> Duration.between(entryTime, et).toMinutes())
                .orElse(0L);
    }

    // 构建器模式使用
    public static ParkingRecord example() {
        return ParkingRecord.builder()
                .plateNumber("京A12345")
                .entryTime(LocalDateTime.now().minusHours(2))
                .feeConfigId(1L)
                .parkingLotId(1001L)
                .vehicleType("small")
                .build();
    }
}
